package org.example.day;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: TODO
 * @Author wyatt
 * @Data 2024/05/22 10:13
 */

//给你一个整数数组 matches 其中 matches[i] = [winneri, loseri] 表示在一场比赛中 winneri 击败了
//loseri 。
//
// 返回一个长度为 2 的列表 answer ：
//
//
// answer[0] 是所有 没有 输掉任何比赛的玩家列表。
// answer[1] 是所有恰好输掉 一场 比赛的玩家列表。
//
//
// 两个列表中的值都应该按 递增 顺序返回。
//
// 注意：
//
//
// 只考虑那些参与 至少一场 比赛的玩家。
// 生成的测试用例保证 不存在 两场比赛结果 相同 。
//
//
//
//
// 示例 1：
//
//
//输入：matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]]
//输出：[[1,2,10],[4,5,7,8]]
//解释：
//玩家 1、2 和 10 都没有输掉任何比赛。
//玩家 4、5、7 和 8 每个都输掉一场比赛。
//玩家 3、6 和 9 每个都输掉两场比赛。
//因此，answer[0] = [1,2,10] 和 answer[1] = [4,5,7,8] 。
//
//
// 示例 2：
//
//
//输入：matches = [[2,3],[1,3],[5,4],[6,4]]
//输出：[[1,2,5,6],[]]
//解释：
//玩家 1、2、5 和 6 都没有输掉任何比赛。
//玩家 3 和 4 每个都输掉两场比赛。
//因此，answer[0] = [1,2,5,6] 和 answer[1] = [] 。
//
//
//
//
// 提示：
//
//
// 1 <= matches.length <= 10⁵
// matches[i].length == 2
// 1 <= winneri, loseri <= 10⁵
// winneri != loseri
// 所有 matches[i] 互不相同
//
//
// Related Topics 数组 哈希表 计数 排序 👍 34 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
public class Solution2225 {

    public static void main(String[] args) {
        Solution2225 solution2225 = new Solution2225();
        int[][] matches = new int[][]{{2,3},{1,3},{5,4},{6,4}};
        System.out.println(solution2225.findWinners(matches));
    }


    public List<List<Integer>> findWinners(int[][] matches) {
        HashMap<Integer, Integer> winMap = new HashMap<>();
        HashMap<Integer, Integer> loseMap = new HashMap<>();
        for(int i=0;i<matches.length;i++){
            int winner = matches[i][0];
            if(!winMap.containsKey(winner)){
                winMap.put(winner, 0);
            }
            int loser = matches[i][1];
            if(!loseMap.containsKey(loser)){
                loseMap.put(loser, 1);
            }else {
                loseMap.put(loser, loseMap.get(loser) + 1);
            }
        }
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> winList = new ArrayList<>();
        List<Integer> loseList = new ArrayList<>();

        if(winMap.size() > 0){
            for(Integer winner : winMap.keySet()){
                if(!loseMap.containsKey(winner)){
                    winList.add(winner);
                }
            }
        }

        if(loseMap.size() > 0){
            for(Integer loser : loseMap.keySet()){
               if(loseMap.get(loser) == 1){
                   loseList.add(loser);
               }
            }
        }

        winList = winList.stream().sorted().collect(Collectors.toList());
        loseList = loseList.stream().sorted().collect(Collectors.toList());
        result.add(winList);
        result.add(loseList);
        return result;
    }

}
